//C 语言Wrap 层 文法 关心的： 结构体 、 函数定义 、 动态库导出开始宏 （#define EXPORT_API extern "C"）
//语法关系 从粗 到 细来梳理
//
grammar Wrap;

prog: root+;

//慌声明
root:
    DEFINE
	|fun_decl	
    | decl
	|cpp_class_decl
	| NEWLINE
    ;

cpp_class_decl:
	CLASS_ID WORD NEWLINE* block ';'
;//C++ class定义

//函数定义
fun_decl : 
		//  id_list? decl_name '(' WORD* ')' block
		 id_list? decl_name decl* NEWLINE* block
		 // 标识组? 有名声明 声明*
;

//声明
decl: 
    id_list (var_decl_init (',' var_decl_init)*)?';'
    // 标识组 (变量定义并初始化 (',' 变量定义并初始化)*)? ';'
;

//变量定义并初始化
var_decl_init : 
            // WORD
            // decl_name ( '=' WORD)?
            decl_name ( '=' init_val)?
            //有名声明 ('=' 初值)?
;

/**
块 段 
 */
block : 
	// '{' .*? '}'
	'{' blockItem* '}'
	// '{' decl* c_sentence*'}'
	// '{' 声明*  句* '}'
	;

//块内容
blockItem : 
           block
           | COMMENT
           | LINE_COMMENT
           |  ~('{' | '}')*? (NEWLINE | EOF)
;

//粗宏
// DEFINE: '#' .*? (NEWLINE | EOF); //宏
DEFINE: 
	'#' .*? ('\\' NEWLINE .*? )* (NEWLINE | EOF)
; //宏 ，支持 \ 分行

// //动态库 导出 宏标识
// m_externc:'#define' 'EXPORT_API' 'extern' '"C"' ('__declspec' '(' 'dllexport' ')')?;

// //式
expr: 
    WORD 
    | CONSTANT 
    // | STRING 
    | '(' expr ')'; //圆括号

// expr_list: expr (',' expr)*; //参数式组

init_val : 
		  expr
		 | '{' init_val (',' init_val)* ','? '}'
;//初始值


CONSTANT: 
        REAL_NUM 
        | INT 
        | VAL_CHAR_STR 
        // | WORD		//#
		; //常数

POINTER: '*' OPTIMIZ_ID* POINTER?; //指针
// //结构体-----------------------------------------------

struct_decl: decl_name | decl_name? ':' expr; //结构体变量定义 

struct_optimiz_id:
	c_type struct_optimiz_id?
	| OPTIMIZ_ID struct_optimiz_id?; //类型与优化标识组

struct_inside_decl:
	struct_optimiz_id struct_decl (',' struct_decl)* ';'
	| OPTIMIZ_ID? (struct_union | cpp_enum | c_enum)';'
	| NEWLINE
	; //结构体内声明

struct_union:
	STRUCT_UNION_ID WORD? NEWLINE* '{' struct_inside_decl* '}'
	| STRUCT_UNION_ID WORD; //结构体与共用体

// // //tes strct struct : STRUCT_UNION_ID struct_var_decl '{ int a; };';

// 枚举体-----------------------------------------------
enum_decl: 
	WORD ('=' expr)?
	|NEWLINE
; //枚举词声明
c_enum:
	'enum' WORD? '{' enum_decl? (',' enum_decl)* ','? '}'
	| 'enum' WORD; //枚举体

cpp_enum:
	'enum' CLASS_ID WORD (':' id_list)? '{' enum_decl? (',' enum_decl)* ','? '}'
	|'enum' CLASS_ID? WORD ':' id_list '{' enum_decl? (',' enum_decl)* ','? '}'
	// 'enum' CLASS_ID WORD enum_def_type? '{' enum_decl? (',' enum_decl)* ','? '}'
	// |'enum' WORD enum_def_type '{' enum_decl? (',' enum_decl)* ','? '}'
;//c++ 枚举体

cpp_scope_type :
	WORD '::' WORD ('::' WORD)*
;//域访问类型

// //声明-----------------------------------------------
c_type:
	'void'
	| 'char'
	| 'short'
	| 'int'
	| 'long'
	| 'float'
	| 'double'
	| 'signed'
	| 'unsigned'
	| struct_union
	| cpp_enum
	| c_enum
	| cpp_scope_type
	| WORD;

id_list:
	STORAGE_ALIAS_ID id_list?
	| OPTIMIZ_ID id_list?
	| c_type id_list?; //标识组

decl_name_sub:
	WORD
	| '(' decl_name ')'
	| decl_name_sub '[' expr? ']'
	| decl_name_sub '(' parameter_list? ')'
	| decl_name_sub '(' (WORD (',' WORD)*)? ')'; //有名 子声明

decl_name: POINTER? decl_name_sub; //有名声明

decl_no_name_sub:
	'(' decl_no_name ')'
	| decl_no_name_sub '[' expr? ']'
	| '[' expr? ']'
	| decl_no_name_sub '(' parameter_list? ')'
	| '(' parameter_list? ')'; //无名子声明

decl_no_name: POINTER | POINTER? decl_no_name_sub; //无名声明

// //参数----------------------------------------------
parameter: 
    // id_list decl_name 
    id_list POINTER? '&' decl_name_sub ( '=' expr)?      //带&引用定义
    | id_list decl_name ( '=' expr)?      //为了 c++ 支持 参数默认值
    | id_list decl_no_name?
; //形参
parameter_list: (parameter (',' parameter)*) (',' '...')?; //形参组及变参

// //字符串----------------------------------------------
// STRING: 'L'? '"' CHAR_STR+ '"'; //字符串
VAL_CHAR_STR: 'L'? '\'' CHAR_STR+ '\''; //字符值

// //实数-----------------------------------------------
REAL_NUM:
	FLOAT EXP_PART? SUFFIX_REAL_NUM?
	| DIGIT+ EXP_PART SUFFIX_REAL_NUM?; //实数
fragment FLOAT: DIGIT+ '.' DIGIT* | '.' DIGIT+; //浮点数
fragment EXP_PART: ('e' | 'E') POS_NEGA? DIGIT+; //指数部 

fragment SUFFIX_REAL_NUM: 'f' | 'l' | 'F' | 'L'; //实数后缀

//整数----------------------------------------------
INT: (INT_TEEN | INT_EIGHT | INT_SIXTEEN) SUFFIX_INT?; //整数
fragment INT_TEEN: DIGIT_NZERO DIGIT*; //十进制整数
fragment INT_EIGHT: '0' DIGIT_EIGHT*; //十进制整数
fragment INT_SIXTEEN: '0' ('x' | 'X') DIGIT_SIXTEEN*; //十进制整数

fragment SUFFIX_INT:
	SUFFIX_UNSIGNED SUFFIX_LONG?
	| SUFFIX_LONG SUFFIX_UNSIGNED?; //整数后缀
fragment SUFFIX_UNSIGNED: 'u' | 'U'; //unsigned 后缀
fragment SUFFIX_LONG: 'l' | 'L'; //long 后缀

//基础----------------------------------------------
STORAGE_ALIAS_ID :
	'typedef'
	| 'extern'
	| 'static'
	| 'auto'
	| 'register'; //存储与别名标识
    
OPTIMIZ_ID: 'const' | 'volatile'; //优化标识
STRUCT_UNION_ID: 'struct' | 'union'; //结构 联合
// CLASS_ID : 'class' -> skip;//class 关键字
CLASS_ID : 'class';//class 关键字

WORD: ALPHA (ALPHA | DIGIT)*; //单词 标识符
// // fragment CHAR_STR : ~[\'\\\r\n] | ESC;                  //字符串字符
fragment CHAR_STR: ~('\'' | '\\' | '\r' | '\n') | ESC; //字符串字符
fragment DIGIT: [0-9]; //单个数字
fragment DIGIT_NZERO: [1-9]; //非0 单个数字
fragment DIGIT_EIGHT: [0-7]; //八进制 单个数字
fragment DIGIT_SIXTEEN: [0-9a-fA-F]; //十六进制 单个数字

fragment ALPHA: [a-zA-Z] | '_'; //单字母
fragment POS_NEGA: '+' | '-'; //正负符号
fragment ESC_COM:'\\' ('\''| '"'| '?'| '\\'| 'a'| 'b'| 'f'| 'n'| 'r'| 't'| 'v'); //常用转义字符
fragment ESC_EIGHT:'\\' DIGIT_EIGHT DIGIT_EIGHT? DIGIT_EIGHT?; //八进制转义组
fragment ESC_SIXTEEN: '\\' 'x' DIGIT_SIXTEEN*; //十六进制转义组
ESC: ESC_COM | ESC_EIGHT | ESC_SIXTEEN; //转义组

NEWLINE: NR NR? -> skip; //一个新行的开始
NR : ('\n'|'\r') -> skip;
//匹配丢弃
WS: [ \t\n\r]+ -> skip; //丢弃空白字符
LINE_COMMENT: '//' (~'\n')*? '\n' -> skip; //行注释 丢弃
COMMENT: '/*' .*? '*/' -> skip; //块注释 丢弃